package traitementRequetes;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;

public class RecuperationDonnees {

	public RecuperationDonnees() {
		super();
	}

	/**
	 * Méthode permettant de récupérer les données auprès de dbpedia
	 * 
	 * @param requete
	 *            : requete entrée par l'utilisateur dont on cherche les
	 *            résultats
	 * @return donneesRetournees : objet constitué de trois attributs, les
	 *         résultats, les résultats en clusters et le nombre de colonnes
	 *         (pour l'affichage ultérieur)
	 */
	public DonneesRetournees recupererDonnees(String requete) {
		DonneesRetournees donnees = new DonneesRetournees();
		List<String> colonnes = new ArrayList<String>();
		List<List<String>> lignesResultats = new ArrayList<List<String>>();
		String service = "http://fr.dbpedia.org/sparql";

		// Interrogation du service.
		Query query = QueryFactory.create(requete);
		QueryExecution qExec = QueryExecutionFactory.sparqlService(service,
				query);
		ResultSet resultats = qExec.execSelect();

		// On récupère les noms des colonnes contenus dans la première ligne du
		// ResultSet
		QuerySolution q = resultats.next();
		Iterator<String> it = q.varNames();
		while (it.hasNext()) {
			String nomColonne = it.next();
			colonnes.add(nomColonne);
		}

		while (resultats.hasNext()) {
			ArrayList<String> ligne = new ArrayList<String>();
			// Pour chaque colonne de la ligne concernée, on va récupérer la
			// valeur prise par le concept.
			for (String nom : colonnes) {
				String valeur = "valeur illisible";
				// On distingue deux cas pour l'affichage : le cas où on a un
				// literal et le cas où on a une URI.
				try {
					valeur = q.get(nom).asLiteral().getString();
				} catch (Exception e) {
					try {
						valeur = q.getResource(nom).getURI();
					} catch (Exception e2) {

					}
				}
				// On rajoute le String obtenu à la ligne.
				ligne.add(valeur);
			}
			// Une fois que l'on a fini de récupérer la ligne, on l'ajoute à
			// l'ensemble des lignes et on passe à la suivante.
			lignesResultats.add(ligne);
			q = resultats.next();
		}

		donnees.setColonnes(colonnes);
		donnees.setResultats(lignesResultats);

		return donnees;

	}

}
